/*
 * EntityFactory.cpp
 *
 */

#include "EntityFactory.h"
#include "../exceptions/ProgramException.h"
#include "../utils/StringUtils.h"
EntityFactory::EntityFactory() {

}

EntityFactory::~EntityFactory() {
}

IEntidad* EntityFactory::createEntity(ESTRUCTURAS estructura) {

	IEntidad* entidad = NULL;
	switch (estructura) {
	case FECHAASC_IDRSS:
		entidad = new SimpleSecondaryIndex();
		break;
	case AUTOR_IDRSS:
		entidad= new SimpleStringSecondaryindex();
		break;
	case AUTOR_IDTWEET:
		entidad=new SimpleStringSecondaryindex();
		break;
	case TITULO_IDRSS:
		entidad=new SimpleStringSecondaryindex();
		break;
	case TITULO_IDTWEET:
		entidad=new SimpleStringSecondaryindex();
		break;
	default:
		string mensaje;

		mensaje.append(
				"Entity Factory No esta configurada la creacion de entidades para la entidad ").append(
				StringUtils::intToString(estructura));
		throw ProgramException(mensaje);
		break;

	}
	return entidad;
}

SimpleSecondaryIndex* EntityFactory::createSimpleSecondaryIndex(
		ESTRUCTURAS type) {
	SimpleSecondaryIndex* entidad = new SimpleSecondaryIndex();
	return entidad;
}

SimpleStringSecondaryindex* EntityFactory::createSimpleStringSecondaryIndex(
		ESTRUCTURAS type) {
	SimpleStringSecondaryindex* entidad= new SimpleStringSecondaryindex();
	return entidad;
}

//Este metodo es solo para el arbol. Lo dejo asi por andar haciendo funciones amigos. Si lo usan mal lo saco.
IEntidad* EntityFactory::createEntity(ESTRUCTURAS type, IElement* element) {
	IEntidad* entidad = NULL;
	try {
		entidad = EntityFactory::createEntity(type);

	} catch (ProgramException& e) {
		entidad = EntityFactory::createSimpleSecondaryIndex(type);
	}
	string serializedElement;

	serializedElement.append(element->getData(), element->getDataSize()); // += element->getData();
	if(!entidad->isStringId()){
		//cout<<element->getKey().getRealKey();
		entidad->setID(StringUtils::stringToId(element->getKey().getRealKey()));
	}else{
		entidad->setIdstring(element->getKey().getRealKey());
	}
	entidad->unserialize(serializedElement);
	return entidad;
}
